﻿package gdca.util;

import com.gdcalib.PSIApp;


public class CAManager {
	String passwd = "123456";	
	PSIApp psij;
	public CAManager()
	{
		psij = PSIAppFactory.getInstance();
	}
	/**
	**data 原文 type=0或者type=2.
	*调用证书申请，更新，注销等WEBSERVICE接口时，此值取type=0
	****调用写机构代码电子副本时，此值去type=2.
	返回值为签名值
	*/
	public String sign(String data, int type)
	{
		int status = psij.GetCurStatus();
		if(status != 0)
		{
			psij.release();
			return null;
		}
		int error = psij.AdvGDCA_Login(2);
		if (error != 0) {
			psij.release();
			return null;
		}
		String outData = psij.AdvSignData(passwd,data.getBytes(),32772,type);
		if(status != 0)
		{
			psij.release();
			return null;
		}
		return outData;
	}
	
	/**
	 * 验证签名方法
	 * @param signData 原文
	 * @param signValue 签名值
	 * @param signCert  签名证书
	 * @param type
	 * @return
	 */
	public boolean verify(String signData, String signValue, String signCert, int type)
	{
		int status = psij.GetCurStatus();
		if(status != 0)
		{
			psij.release();
			return false;
		}
		boolean ret = psij.AdvVerifySign(signCert, signData.getBytes(), signValue, 32772, type);
		status = psij.GetCurStatus();
		if(status != 0)
		{
			psij.release();
			return false;
		}
		return ret;
	}
	
	/**
	 * base64编码
	 * @param data 原文
	 * @return
	 */
	public String base64En(byte[] data)
	{
		int status = psij.GetCurStatus();
		if(status != 0)
		{
			psij.release();
			return null;
		}
		String result = psij.AdvBase64Encode(data);
		status = psij.GetCurStatus();
		if(status != 0)
		{
			psij.release();
			return null;
		}
		return result;
	}
	
	/**
	 * base64解码
	 * @param data 
	 * @return
	 */
	public byte[] base64De(String data)
	{
		int status = psij.GetCurStatus();
		if(status != 0)
		{
			psij.release();
			return null;
		}
		byte[] result = psij.AdvBase64Decode(data);
		status = psij.GetCurStatus();
		if(status != 0) {
			psij.release();
			return null;
		}
		return result;
	}
	
	/**
	 * 获取密码机的签名证书
	 * @return
	 */
	public String getSignCert()
	{
		int status = psij.GetCurStatus();
		if(status != 0)
		{
			psij.release();
			return null;
		}
		return psij.B64SignCert;
	}
	
	/**
	 * 获取密码机的机密证书
	 * @return
	 */
	public String getEncCert()
	{
		int status = psij.GetCurStatus();
		if(status != 0)
		{
			psij.release();
			return null;
		}
		return psij.B64EnCert;
	}
	
	//////////////////////////////////请注意，在这里加入您的XML签名的方法即可///////////////////	
	/**加入的时候。代码的写法要和签名那些函数的写法一样，首先获取密码机状态
	int status = psij.GetCurStatus();
	if(status != 0)
	{
		psij.release();
		return null;
	}
	然后登陆
	int error = psij.AdvGDCA_Login(2);
	if (error != 0) {
		psij.release();
		return null;
	}
	然后还有其他你需要填写的逻辑。
	*/
	public String signP7(String data, int type)
	{
		int status = psij.GetCurStatus();
		if(status != 0)
		{
			psij.release();
			return null;
		}
		int error = psij.AdvGDCA_Login(2);
		if (error != 0) {
			psij.release();
			return null;
		}

		byte[] outData = psij.AdvGDCA_Pkcs7Sign(base64De(psij.B64SignCert), data);
		status = psij.GetCurStatus();
		if(status != 0)
		{
			psij.release();
			return null;
		}
		return base64En(outData);
	}
	/////////////////////////
	
	
}
